Lightning Network 概要
以下、Lightning NetworkをLNと省略することがあります。
Bitcoinの復習
Lightning Networkの前に簡単にBitcoinの性質を振り返る。
Bitcoinとは何か
アリスからボブへの送金を考える。
アリス:送金者
ボブ:受信者
このとき、
アリスはボブにお金を送金できる
ボブは何もしなくていい
ボブは誰かを信頼しなくていい
ボブは受け取ったお金を使えるようになるまで少し待たないといけない
ボブは秘密鍵を厳重に管理しなければならない
Bitcoinはどのように動作するか
ブロックチェーン
トランザクションはブロックにまとめられる
ブロックは一つ前のブロックのIDを含む
ブロックのメッセージダイジェストはtargetより小さくなければならない
UTXO
Bitcoinにおけるコイン
トランザクションは一つ前のトランザクションのアウトプットを消費する
あるトランザクションから前のトランザクションを何度もさかのぼっていくと、最終的にCoinbaseトランザクション(マイニングによって生成されたインプットのないトランザクション)にたどり着く
あるUTXOがブロックに取り込まれると、新たなUTXOが生成される
スクリプト
Bitcoinにもスマートコントラクトがある
UTXO消費のルールを定める
例えばPay-to-Public-Key-Hash (P2PKH) (自分が所有するお金しか消費できない)
その他にもマルチシグ、OP_RETURN等
Bitcoinはスケールしない
なぜか?
グローバルなコンセンサス
全ノードが全データを閲覧・検証・保存可能
全員が同じブロックチェーンに合意しなければならない
難しいが、Bitcoinはこれらを初めて達成した。
これに加えて毎秒1000txをさばけるようにするとなると非常に困難になってくる。
もし全データを配信しなくていいならどうなる?
→Lightning Network
他の課題
Bitcoinには最小送金額の制約がある
トランザクションのデータサイズに応じて手数料が決まる
送金においてはほとんど固定されてるようなもの(柔軟に変えられない)
Bitcoin価格の高騰によりトランザクション手数料も高騰している
数円未満の金額をやり取りするような少額決済には向いていないのではないか?
→Lightning Network
※Bitcoin手数料の参考情報
トランザクションインプット/アウトプットを変えながらデータサイズや手数料を計算してくれる
[https://gyazo.com/a42a2f93080397fd92623e6688080418
mempoolに入ってるトランザクションを可視化
https://gyazo.com/2799997e327b9abd2ca39649db9151db
過去のトレンド見れる
https://gyazo.com/799d723f3acda48e80e434bb019be026
Lightning Networkとは
Lightning Networkは非中央集権なシステムで、即時・大量の少額決済をトラストレスに実現する。
双方向ペイメントチャネルのP2Pネットワーク
全データを配信しないBitcoin上のLayer 2アプリケーション
安くて早いマイクロペイメントを実現する
すごくスケールする(スループットの制限無し)
トラストレス
Bitcoinとは異なる性質、トレードオフを持つ。
例えば、自分のLNノードがオンラインじゃないとお金を受け取れない。
Lightning Networkのセールスポイント
即時決済
Bitcoinは10分間隔でブロックにトランザクションを集めていく。支払いは6ブロック承認後、つまり約1時間後に安全だと見なされるようになる。Lightning Networkでは、支払いはブロック承認が不要で、即座に、atomicに行われる。これによって、POSレジやデバイス間トランザクションなど即時決済が必要とされる箇所で利用できる。
マイクロペイメント
少額決済により新たな市場が開かれるようになる。
Lightning Networkでは、カストディに対するトラストリスクを負うことなしに0.00000001 BTC (1 satoshi) から送金できるようになる。
Bitcoinでは、最小送金額はLightningの何百倍も高く設定されており、またトランザクションサイズによって手数料が固定され、少額決済の実用利用は不可能になっている。
Lightningでは、実際のBitcoinトランザクションを利用して、Bitcoinで表示される最小限の支払いが可能になる。
スケーラビリティ
IoTデバイスはますます増加し、デバイス間の支払いや自動少額支払いのプラットフォームが必要になる。そのとき、Bitcoinは桁違いに大量のトランザクションを捌く必要が出てくる。
Lightning Networkのトランザクションはオフチェーンで信頼や所有権の委譲無しに実行できるため、デバイス間のトランザクションはほぼ無制限に実行できるようになる。
まずは使ってみよう
カストディアルLightning Networkウォレット
BlueWalletが用意したLNノードに資金を預けるタイプのウォレット
チャネルを開く必要無し
オンラインでなくても受け取れる
LNノードの管理が不要
UXが良くなる
振る舞いはカストディアルじゃないLNウォレットと同じ
トレードオフについてはブログで詳しく解説されている 自分でLN立てたノードを選択することもできる
双方向Payment channel
Bitcoinはトランザクションとブロックチェーンによって支払いを実現していた。
Lightning Networkではトランザクションをチェーンに書き込まずにやりとりして支払いを実現する。
基本は二者間の双方向ペイメントチャネルであり、それを繋げてP2Pネットワークを形成する。
支払いのざっくり手順
二者でマルチシグアドレスを作成し、互いにデポジットする
コミットメントTxも作成し、相手に署名しておいてもらう
自分の預けたデポジットを自分に払い戻すアウトプットがある
自分が署名すればブロードキャストできる
支払いの都度ブロックチェーンに書き込むのではなく、コミットメントTxを更新する
コミットメントTxを更新するとき、古いコミットメントTxを無効化 (revoke)
支払いのもう少し詳しい手順
アリスがボブに支払う想定で考える。
途中でボブがアリスに戻したり、再度アリスがボブに支払ったりもする。
※それでも結構省略してます
チャネルオープン
アリスとボブの間で2-2マルチシグアドレスを作成
アリスはマルチシグアドレスに1BTC送金するトランザクションを作成し、ボブに送信(署名はしない)
ボブはマルチシグアドレスのアウトプットを利用し、アリスの払い戻し用アドレスに1BTC送金するコミットメントTxを作成・署名し、アリスに送信する
このコミットメントTxのアウトプットは30日のnLockTimeが設定されている(この例の場合)
コミットメントTxを受け取ったアリスはマルチシグアドレスへの送金Txをブロードキャスト
ブロック承認されたらチャネルオープンとなる
コミットメントTxはブロードキャストしない
ボブが消えるとアリスが預けた1BTCを引き出せなくなるため、このような初期状態になっている。
ただしコミットメントTxのアウトプットには30日のnLockTimeが設定されており、30日後でないと有効なトランザクションにならない。
mosa_siru.icon < ちなみに、nLockTimeは「指定した時間までブロックに取り込まれない」というもので、「指定した時間まで使えない」ことは担保できない(同一UTXOを用いた別TXは作れる)のでこの例には向かず、絶対時間指定のCLTV(Check Lock Time Verify), 相対時間指定のCSV(Check Sequnence Verify)が用いられる。これらはブロックには取り込まれた上でロックされる。
shuntak.icon < 確かに。実際のc-lightning実装のコミットメントTxではOP_CSVが使われてます。
https://gyazo.com/ee71eda0e0a8bd9133e629e996b84a4a
アリスからボブへ0.1BTC支払い
ボブからアリスに0.1BTC要求
アリスは以下のコミットメントTxを作成・署名してボブに送信
アリスへのアウトプット: 0.9BTC
ボブへのアウトプット: 0.1BTC
ボブはコミットメントTxを確認し、問題なければ前の払い戻しTx (アリスに1BTC戻すやつ) を無効にする
ボブはいつでもコミットメントTxをブロックチェーンに反映できる
https://gyazo.com/8ce2f955ac77d1a674da3559a99f8663
おことわり
このあたり、本当はpreimage(乱数), invoice(請求書+preimageのhash), HTLC (Hashed Timelock Contract) というアウトプットを作成&やりとりして実現してるのですが、概要編ということで省略してます。
実際はHTLCを介在した中間状態を1ステップずつ同期的にやりとりし、送金中に裏切りがあっても大丈夫なように設計されています。
さらにアリスからボブへ0.1BTC支払い
先ほどと同様の手順で支払う。
https://gyazo.com/8d96a61a0bb1b2d3428c505cc25a2b2c
ボブからアリスへ0.1BTC支払い
先ほどと逆の手順で支払う。
https://gyazo.com/4e25e91a809e3fae17b9502664565d47
チャネルクローズ
最後のコミットメントTxはボブに署名されている。
アリスはコミットメントTxに署名し、オンチェーンのネットワークにブロードキャストする。
トランザクションがブロックに取り込まれ、ブロックが承認されるとチャネルがクローズされる。
https://gyazo.com/b0967d3c33433114aa637b9c34a5c8be
悪意のあるユーザー
上の例では以下のように残高が移動していた。
(1) アリス 1BTC : ボブ 0 BTC
(2) アリス 0.9BTC : ボブ 0.1BTC
(3) アリス 0.8BTC : ボブ 0.2BTC
(4) アリス 0.9BTC : ボブ 0.1BTC (最終状態)
もし悪意を持ったボブが(3)状態のコミットメントTxをブロードキャストしたらどうなるか?
つまり、本来ボブの最終状態は0.1BTCであるが、(3)状態が承認されれば0.2BTCとなり、(4)状態よりも得する。
一方でアリスは損をすることになるので防ぎたい。
実際のコミットメントTx
実際のコミットメントTxにはアリス用とボブ用の2つが存在している。
(3)状態のコミットメントTxは以下の図のようになる。
https://gyazo.com/3cc73a5b32c520f5e01eb680fabe22a9
無効化とは実際には互いにREVOCATON-A/Bを交換すること
(3)状態から(4)状態に遷移するにあたってREVOCATON-A/Bを交換
互いにREVOCATION-A/Bを持った状態で古いコミットメントTxをブロードキャストすると、ブロードキャストしなかった側は2つのアウトプット両方を利用できるようになる
→ 古いコミットメントTxをブロードキャストしないインセンティブが働くようになる。
もしボブが古いコミットメントTxをブロードキャストした場合、アリスはREVOCATION-Bを利用してボブへの0.2BTCアウトプットを利用できるようになる。
ただし、OP_CSVの期限が過ぎたらボブも0.2BTCアウトプットを利用できるようになってしまうため、アリスは全てのREVOCATION-Bを保存し、定期的に古いコミットメントTxがブロードキャストされていないか監視し、もしブロードキャストされていれば自分で能動的に署名してボブを罰しなければならない。
これはとても大変なので、Watchtower等の監視サービスが開発されている。
第3者経由での支払い
双方向ペイメントチャネルを繋げてP2Pネットワークを形成することで実現する。
プライバシー
送金経路情報はOnionルーティングプロトコルによって符号化されており、送金経路の中間ノードは受け取ったメッセージから次の転送先の情報しか知ることができない。転送先がなければ自分自身への送金だと分かる。
Lightning Networkの制約
オンチェーントランザクションと違い、LNでは送金先がオフラインだと支払いできない
カストディアルLNウォレットを使うことでUXを改善できる
資産の安全のため、ネットワーク参加者は定期的にペイメントチャネルを監視する必要がある
Watchtowerなどの監視サービスへの委託によって克服しうる
LNはまだ高額の支払いには適していない
ネットワークは多くのマルチシグウォレット(基本的には共有ウォレット)を考慮しており、これらのウォレットは高額な支払いの中間者として振る舞うには十分な残高を持っていない可能性が高い
ペイメントチャネルの開閉には通常、手作業とより高い手数料を要求するオンチェーントランザクションを伴う
今後詳しく調べたいこと
支払いの詳細なシーケンス
HTLC (Hashed Timelock Contract)
実際のスクリプト
悪意のあるユーザー
トランザクション
ファンディングTx
コミットメントTx
HTLC Tx
Revoked Tx
クロージングTx
鍵
生成方法
鍵管理
Onionルーティングプロトコル
経路情報の作成
送金の中継
再送
悪意のある中継ノード
プライバシー
関連情報
ペーパー
サマリー
ステートチャネル
shuntak.icon > ありがとう
スライド
ブログ等
Lightning Network仕様
Lightning Network実装
実装が先行してるのはこっち
仕様をリードしてるのはこっち
こちらのリポジトリのissueでもLNの仕様についてかなり議論されてる
関連動画
https://youtu.be/J4igz--40as
https://www.youtube.com/watch?v=AmFC9dhtemo
https://vimeo.com/316633427
テーマソング
https://www.youtube.com/watch?v=edItjMHez48